/**
 * @module utils/CaptureUtil
 * @desc 截图操作工具
 */

import { jsPDF as JsPDF } from 'jspdf';
import html2canvas from 'html2canvas';

const ImageType = {
  PNG: 'image/png',
  JPEG: 'image/jpeg'
};


/**
 * 图片转为pdf文件
 * @param {*} image 图片
 * @param {Object} pdfOption pdf配置参数
 */
function imageToPdf(image, pdfOption) {
  let opts = Object.assign(
    {
      padding: [10, 10, 10, 10],
      orientation: 'l',
      unit: 'px',
      hotfixes: ['px_scaling']
    },
    pdfOption
  );
  // 设置pdf宽高
  let width = opts.imageWidth;
  let height = opts.imageHeight;
  let padding = opts.padding;
  if (padding) {
    width = width + (padding[0] || 0) + (padding[2] || 0);
    height = height + (padding[1] || 0) + (padding[3] || 0);
  }
  // 生产pdf文件
  let pdf = new JsPDF({
    orientation: opts.orientation,
    format: [width, height],
    unit: opts.unit,
    hotfixes: opts.hotfixes
  });
  // 插入图片
  let offsetX = padding ? padding[4] || padding[2] || padding[0] : 0;
  let offsetY = padding ? padding[0] : 0;
  pdf.addImage(image, opts.imageType, offsetX, offsetY, opts.imageWidth, opts.imageHeight);
  return pdf.output('bloburl');
}

/**
 * 图片转为文件
 * @param {*} image 图片
 * @param {String} fileName 文件名称
 */
function imageToFile(image, fileName) {
  let arr = image.split(','),
    mine = arr[0].match(/:(.*?);/)[1],
    bstr = atob(arr[1]),
    n = bstr.length,
    u8arr = new Uint8Array(n);
  while (n--) {
    u8arr[n] = bstr.charCodeAt(n);
  }
  let file = new File([u8arr], fileName, { type: mine });
  return file;
}

/**
 * 下载
 * @param {*} output 下载数据
 * @param {String} fileName 文件名称
 */
function download(output, fileName) {
  let a = document.createElement('a'); // 生成一个a元素
  let event = new MouseEvent('click'); // 创建一个单击事件
  a.download = fileName; // 设置文件名称
  a.href = output; // 将生成的URL设置为a.href属性
  a.dispatchEvent(event); // 触发a的单击事件
}

/**
 * 截图
 * @param {*} element 页面DOM元素
 * @param {Object} option 参数设置
 */
export function capture(element, option) {
  let opts = Object.assign(
    {
      fileName: 'picture',
      imageType: 'png',
      doDownload: true,
      outputType: 'image',
      pdfOption: {}
    },
    option
  );
  return new Promise((resolve) => {
    html2canvas(element, {
      allowTaint: true,
      useCORS: true //是否尝试使用CORS从服务器加载图像
    }).then((canvas) => {
      // 得到图片的base64编码数据
      let image = canvas.toDataURL(ImageType[opts.imageType.toUpperCase()]);
      let output = image;
      if (opts.outputType.toUpperCase() === 'PDF') {
        // 转换成pdf文件
        output = imageToPdf(image, Object.assign(opts.pdfOption, {
          imageType: opts.imageType.toUpperCase(),
          imageWidth: canvas.width,
          imageHeight: canvas.height
        }));
      } else if (opts.outputType.toUpperCase() === 'FILE') {
        output = imageToFile(image, opts.fileName);
      }
      console.log(output);
      if (opts.doDownload) {
        download(output, opts.fileName);
      }
      resolve(output);
    });
  });
}